/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.asportoonline.actions;

import org.asportoonline.entities.Indirizzo;
import java.io.IOException;
import java.util.Calendar;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.asportoonline.business.beans.ClienteManager;
import org.asportoonline.business.delegates.ClienteManagerDelegate;
import org.asportoonline.entities.Cliente;
import org.asportoonline.various.UtenteValidation;
import static org.asportoonline.various.Utils.MD5pwd;

/**
 *
 * @author Luca
 */
public class UtenteAction extends HttpServlet {
    private ClienteManager cm = new ClienteManagerDelegate();
    
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String s = request.getParameter("q");
        
        if(s.equals("register_user_action")) {
            String res = verifica_registrazione(request);
            if(res.equals("OK")) {
                getServletContext().getRequestDispatcher("/MainController?q=index").forward(request, response);
            }
            else {
                request.setAttribute("error", res);
                getServletContext().getRequestDispatcher("/MainController?q=register_user").forward(request, response);
            }
        }
        
        else if(s.equals("fetch_user_data_action")) {
            HttpServletRequest res = recupera_dati(request);
            if(res!=null) {
                getServletContext().getRequestDispatcher("/MainController?q=modify_user").forward(request, response);
            }
            else {
                request.setAttribute("error", "Errore nel recupero dei dati!!!");
                getServletContext().getRequestDispatcher("/MainController?q=index").forward(request, response);
            }
        }
        
        else if(s.equals("modify_user_action")) {
            String res = modifica_dati(request);
            if(res.equals("OK")) {
                request.setAttribute("error", "Dati modificati corretamente!!!");
                getServletContext().getRequestDispatcher("/MainController?q=index").forward(request, response);
            }
            else {
                request.setAttribute("error", res);
                getServletContext().getRequestDispatcher("/MainController?q=fetch_user_data_action").forward(request, response);
            }
        }
        
        else if(s.equals("change_password_action")) {
            String res = cambia_password(request);
            if(res.equals("OK")) {
                request.setAttribute("error", "Password modificata correttamente!!");  //in qst caso error serve a dire che tutto è andato a buon fine
                getServletContext().getRequestDispatcher("/MainController?q=fetch_user_data_action").forward(request, response);
            }
            else {
                request.setAttribute("error", res);
                getServletContext().getRequestDispatcher("/MainController?q=edit_password").forward(request, response);
            }
        }
        
        else if(s.equals("login_action")) {
            String res = verifica_login(request);
            if(res.equals("OK")) {
                getServletContext().getRequestDispatcher("/MainController?q=index").forward(request, response);
            }
            else {
                request.setAttribute("error", res);
                getServletContext().getRequestDispatcher("/MainController?q=login").forward(request, response);
            }
        }
        
        else if(s.equals("logout_action")) {
            HttpSession ses = request.getSession();
            ses.invalidate();
            getServletContext().getRequestDispatcher("/MainController?q=index").forward(request, response);
        }
                
    }
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }
 
    
    private String verifica_registrazione(HttpServletRequest request) throws ServletException, IOException {
        String nome = request.getParameter("nome").toString().trim();
        String cognome = request.getParameter("cognome").toString().trim();
        String via = request.getParameter("via").toString().trim();
        String cap = request.getParameter("cap").toString().trim();
        String citta = request.getParameter("citta").toString().trim();
        double latitudine = Double.parseDouble(request.getParameter("latitudine").toString());
        double longitudine = Double.parseDouble(request.getParameter("longitudine").toString());
        String telefono = request.getParameter("telefono").toString().trim();
        Indirizzo indirizzo = new Indirizzo();
        String cf = request.getParameter("cf").toString().trim();
        String email = request.getParameter("email").toString().trim();
        String conferma_email = request.getParameter("conferma_email").toString().trim();
        String password = request.getParameter("password").toString();
        String conferma_pwd = request.getParameter("conferma_password").toString();
        String datan = request.getParameter("datan").toString().trim();
        Calendar dn = null;
        String urlimmagine = request.getParameter("urlimmagine").toString().trim();
        short tipo;
        
        if(request.getParameter("tipo").toString().equals("cliente")) {
            tipo = 0;
        }
        else tipo = 1;
        
        /* CONTROLLI SUI CAMPI */
        //i campi obbligatori non possono essere vuoti
        if(via.isEmpty() || cap.isEmpty() || citta.isEmpty()) {            
           return "Inserire tutti i campi dell'indirizzo!!!";            
        }
        else {
            indirizzo.setCap(cap);
            indirizzo.setCitta(citta);
            indirizzo.setVia(via);
            indirizzo.setLatitudine(latitudine);
            indirizzo.setLongitudine(longitudine);
        }
        
        //l'email deve essere valida e univoca perche' rappresenta lo username
        if(!UtenteValidation.validateEmail(email)) {
            return "L'email inserita non e' corretta!!!";
        }
        else if(!email.equals(conferma_email)) {
            return "Inseriti due indirizzi email diversi!!!";
        }
        else if(cm.cercaCliente(email) != null) {
            return "L'email inserita non e' disponiibile!!!";
        }
        
        
        //la data di nascita deve essere corretta nel formato e nel contenuto
        if(!UtenteValidation.validateDate(datan)) {
            return "Data di nascita non corretta!!!";
        }
        else {
            String arr[] = datan.split("/");
            int y = Integer.parseInt(arr[2]);
            int m = Integer.parseInt(arr[1])-1;
            int d = Integer.parseInt(arr[0]);
            dn = Calendar.getInstance();
            dn.set(y, m, d);
        }
        
        //controllo CF
        if(!UtenteValidation.validateCF(cf)) {
            return "CF non corretto!!!";
        }
        
        //controllo la password
        if(!password.equals(conferma_pwd)) {
            return "Password non confermata correttamente!!";
        }
        else if(!UtenteValidation.validatePassword(password)) {
            return "La password deve contenere solo caratteri alfanumerici piu' _, e tra 6 e 20 caratteri!!!";
        }
        else {
            password = MD5pwd(password);
        }
        
        //controllo il nome
        if(!UtenteValidation.validateName(nome)) {
            return "Il nome non e' corretto!!";
        }
        
        //controllo il cognome
        if(!UtenteValidation.validateSurname(cognome)) {
            return "Il cognome non e' corretto!!";
        }
        
        /* SETTO I CAMPI DI CLIENTE (ora sono tutti corretti) */
        Cliente c = new Cliente();
        
        c.setCf(cf);
        c.setCognome(cognome);
        c.setData_nascita(dn);
        c.setEmail(email);
        c.setIndirizzo(indirizzo);
        c.setNome(nome);
        c.setPassword(password);
        if(!telefono.isEmpty())     c.setTelefono(telefono);
        c.setTipo(tipo);
        if(!urlimmagine.isEmpty())  c.setUrlimmagine(urlimmagine);
        
        cm.inserisciCliente(c);
        
        HttpSession ses = request.getSession();
        ses.setAttribute("username", email);
        ses.setAttribute("password", password);
        ses.setAttribute("userid", c.getIdCliente());
        ses.setAttribute("tipo_utente", c.getTipo());
        
        return "OK";
    }
    
    private HttpServletRequest recupera_dati(HttpServletRequest request) throws ServletException, IOException {
        HttpSession ses = request.getSession(false); //Se non c'è la sessione, NON ne crea una nuova!!!
        
        if (ses == null) {
            return null;
        }
        
        Cliente c = cm.cercaCliente(ses.getAttribute("username").toString());
        request.setAttribute("nome", c.getNome());
        request.setAttribute("cognome", c.getCognome());
        request.setAttribute("via", c.getIndirizzo().getVia());
        request.setAttribute("cap", c.getIndirizzo().getCap());
        request.setAttribute("citta", c.getIndirizzo().getCitta());
        request.setAttribute("telefono", c.getTelefono());
        request.setAttribute("cf", c.getCf());        
        request.setAttribute("email", c.getEmail());
        request.setAttribute("urlimmagine", c.getUrlimmagine());
        
        //Lavoro la data di nascita perché è un Calendar
        Calendar cal = Calendar.getInstance();
        cal = (Calendar)c.getData_nascita();
        String y = String.valueOf(cal.get(Calendar.YEAR)); //Usando una classe Java già esistente mi tito fuori l'anno e tutto il resto!!
        String m = String.valueOf(cal.get(Calendar.MONTH)+1); //Per quanto rigurada il mese va aggiunta un unità.
        String d = String.valueOf(cal.get(Calendar.DAY_OF_MONTH));        

        String datanascita = d+"/"+m+"/"+y;
        
        request.setAttribute("datan", datanascita);
        
        return request;
    }
    
    private String modifica_dati(HttpServletRequest request) throws ServletException, IOException {
        String via = request.getParameter("via").toString().trim();
        String cap = request.getParameter("cap").toString().trim();
        String citta = request.getParameter("citta").toString().trim();
        double latitudine = Double.parseDouble(request.getParameter("latitudine").toString());
        double longitudine = Double.parseDouble(request.getParameter("longitudine").toString());
        String telefono = request.getParameter("telefono").toString().trim();
        Indirizzo indirizzo = new Indirizzo();
        String urlimmagine = request.getParameter("urlimmagine").toString().trim();

        /* CONTROLLI SUI CAMPI */
        //i campi obbligatori non possono essere vuoti
        if(via.isEmpty() || cap.isEmpty() || citta.isEmpty()) {            
           return "Inserire tutti i campi dell'indirizzo!!!";            
        }
        else {
            indirizzo.setCap(cap);
            indirizzo.setCitta(citta);
            indirizzo.setVia(via);
            indirizzo.setLatitudine(latitudine);
            indirizzo.setLongitudine(longitudine);
        }
                
        /* SETTO I CAMPI DI CLIENTE (ora sono tutti corretti) */
        HttpSession ses = request.getSession(false);
        if(ses == null) {           //teoricamente non fallisce mai!!!
            return "Errore nel recupero della sessione!!";
        }
        
        Cliente c = cm.cercaCliente(ses.getAttribute("username").toString());
        if(c == null) {             //teoricamente non fallisce mai!!!
            return "Utente non trovato!!";
        }
        
        c.setIndirizzo(indirizzo);
        c.setTelefono(telefono);
        c.setUrlimmagine(urlimmagine);
        
        cm.aggiornaCliente(c);
        
        return "OK";
    }
    
    private String cambia_password(HttpServletRequest request) throws ServletException, IOException {
        String vecchia_password = request.getParameter("vecchia_password").toString();
        String nuova_password = request.getParameter("nuova_password").toString();
        String conferma_password = request.getParameter("conferma_password").toString();
        
        if(vecchia_password.isEmpty() || nuova_password.isEmpty() || conferma_password.isEmpty()) {
            return "I campi non sono stati inseriti correttamente!!";
        }
        
        HttpSession ses = request.getSession(false);
        if(ses == null) {           //teoricamente non fallisce mai!!!
            return "Errore nel recupero della sessione!!";
        }
        
        Cliente c = cm.cercaCliente(ses.getAttribute("username").toString());
        if(c == null) {             //teoricamente non fallisce mai!!!
            return "Utente non trovato!!";
        }
                
        vecchia_password = MD5pwd(vecchia_password);
        if(!c.getPassword().equals(vecchia_password)) {
            return "La password non è stata inserita correttamente!!";
        }
        
        if(!UtenteValidation.validatePassword(nuova_password)) {
            return "La nuova password deve contenere solo caratteri alfanumerici piu' _, e tra 6 e 20 caratteri!!!";
        }
        
        if(!nuova_password.equals(conferma_password)) {
            return "La nuova password non è stata confermata correttamente!!";
        }
        
        nuova_password = MD5pwd(nuova_password);
        
        c.setPassword(nuova_password);
        
        cm.aggiornaCliente(c);
        
        ses.setAttribute("password", nuova_password);
        
        return "OK";       
    }
    
    private String verifica_login(HttpServletRequest request) throws ServletException, IOException {
        String email = request.getParameter("email").toString().trim();
        String password = MD5pwd(request.getParameter("password").toString());
        
        Cliente c = cm.cercaCliente(email);
        
        if(c == null) {
            return "Email non esistente!!!";
        }
        
        if(!c.getPassword().equals(password)) {
            return "Password errata!!!";
        }
             
        HttpSession ses = request.getSession();
        ses.setAttribute("username", email);
        ses.setAttribute("password", password);
        ses.setAttribute("userid", c.getIdCliente());
        ses.setAttribute("tipo_utente", c.getTipo());
        
        return "OK";
    }

}
